import java.io.{BufferedReader, FileReader, FileWriter, PrintWriter}
import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
import java.util
import scala.io.{BufferedSource, Source}

object Demo03Base {
  /**
   * def 声明一个函数
   * main 方法名 如果在object中 那就是程序的入口
   * args 参数名
   * Array[String] 参数的类型
   * Unit 返回值的类型 相当于Java中的void
   * {方法体}
   */
  def main(args: Array[String]): Unit = {

    // Scala的基本语法

    // 定义变量
    /**
     * 两种形式：
     * val 不可变的
     * var 可变的
     * 需不需要重新赋值
     */
    val i = 100 // 用val修饰的是不可变的
    println(i)
    //    i = 99 // 如果需要对变量重新赋值 则需要在定义的时候用var修饰

    var j = 200
    println(j)

    j = 199
    println(j) // 用var修饰的变量可以重新赋值 是可变的

    // 如果变量指向数据容器 那么对变量进行操作（增加或者删除元素）时 不会受到val修饰符的限制
    val arrList = new util.ArrayList[Int]()
    arrList.add(1)
    arrList.add(2)
    arrList.add(3)
    println(arrList)

    // 定义变量时也可以指定类型
    val k: Int = 1000
    println(k)
    val p = 200
    println(p.isInstanceOf[Int])
    println(p.getClass)

    // Scala中的基本的数据类型
    /**
     * Java中的8大基本数据类型：
     * byte、short、int、long
     * float、double
     * char
     * bool
     */
    val byte: Byte = 100
    val short: Short = 200
    val int: Int = 300
    val long: Long = 1000L
    val float: Float = 1.1F
    val double: Double = 1.234D
    val char: Char = 'a'
    val bool: Boolean = true

    // 引用数据类型 String
    // 实际上scala中的String就是Java中的String
    // 在Java中字符串有的方法 在Scala中都有
    // 在Scala中还有一些额外的方法(通过隐式转化得到的)
    val string: String = "java,scala,python"

    // 拼接字符串 scala独有的 在Java中是没有的
    // 底层还是基于StringBuilder
    // 如果变量名以下划线开头 需要用{}将整个变量括起来
    val _str: String = "hello"
    println(s"$byte,$short,$int,$long,$float,$double,$char,$bool,${_str}")

    // 写SQL的方式
    "select id,name,age from student order by age limit 10"

    """
      |select id
      |       ,name
      |       ,age
      |from student
      |order by age
      |limit 10
      |""".stripMargin

    // 基本数据类型之间的转换
    // Java的方式 将整型转换为String类型
    val int1: Int = 123
    val str: String = String.valueOf(int1)
    println(str)
    // 再将String转为整型
    val str2: String = "1234567"
    val i1: Int = Integer.parseInt(str2)
    print(i1)

    // Scala的方式 进行 类型转换
    val int2: Int = 123
    println(int2.toByte)
    println(int2.toShort)
    println(int2.toLong)
    println(int2.toFloat)
    println(int2.toDouble)
    println(int2.toString)
    //    println(int2.toHexString) // 转成16进制
    println("123".toInt)

    // 字符串常见的方法
    val str3: String = "1,2,3,4,5,6,7,8"

    val strArr: Array[String] = str3.split(",")
    println(strArr) // 只能得到内存地址
    println(strArr.mkString("|")) // 与split方法相反 指定分隔符 拼接数组中的元素

    println(str3.substring(2, 6)) // 可以把String看成一个字符数组 所以可以通过下标访问元素

    println(str3(8))

    println(str3.take(3))
    println(str3.head)
    println(str3.tail)
    println(str3.last)

    // 运算符
    // 算术运算符 + - * / %
    val m: Int = 10
    val n: Int = 3
    println(m + n)
    println(m - n)
    println(m * n)
    println(m / n)
    println(m % n)

    println(10 * 10) // 算术运算符
    println("10" * 10) // 这里的 * 号 是一个 方法 是下面函数调用的一个简写
    println("10".*(10)) // 完整的调用
    println("*" * 10)

    // 使用StringBuilder拼接字符串
    val builder: StringBuilder = new StringBuilder()

    val hello: String = "hello "
    val world: String = "world "
    val scala: String = "scala!"

    builder.append(hello)
    builder.append(world)

    builder append scala

    println(builder)

    // 逻辑运算符 与 或 非 异或
    val bool1: Boolean = true
    val bool2: Boolean = false

    println(bool1 & bool2)
    println(bool1 | bool2)
    println(bool1 ^ bool2)
    println(!bool1)

    // 读写文件
    // Java的方式
    val br: BufferedReader = new BufferedReader(new FileReader("Scala/data/words.txt"))
    var line: String = br.readLine()
    while (line != null) {
      println(line)
      line = br.readLine()
    }
    println("#" * 50)
    // Scala的方式 链式调用
    val bs: BufferedSource = Source
      .fromFile("Scala/data/words.txt")
    bs
      .getLines()
      .foreach(println) // 运用了函数式编程的思想 将一个函数作为参数传入了另一个函数

    bs.close()

    // Scala没有独有的写文件的方式 可以使用Java的方式
    //    PrintWriter
    //    FileWriter


    // 操作MySQL --- 使用Java的方式 --- JDBC
    // 1、加载驱动
    // 2、建立连接
    val conn: Connection = DriverManager.getConnection("jdbc:mysql://rm-bp1h7v927zia3t8iwho.mysql.rds.aliyuncs.com:3306/stu018?useSSL=false", "bigdata018", "123456")

    // 3、创建Statement
    val pSt: PreparedStatement = conn.prepareStatement("select id,name,age,gender,clazz,last_mod from student where clazz=? and gender=?")

    // 4、设置参数
    pSt.setString(1, "文科一班")
    pSt.setString(2, "男")

    // 5、执行SQL
    val rs: ResultSet = pSt.executeQuery()

    // 6、遍历ResultSet对象获取查询结果
    while (rs.next()) {
      val id: Int = rs.getInt("id")
      val name: String = rs.getString("name")
      val age: Int = rs.getInt("age")
      val gender: String = rs.getString("gender")
      val clazz: String = rs.getString("clazz")
      val last_mod: String = rs.getString("last_mod")

      println(s"$id,$name,$age,$gender,$clazz,$last_mod")
    }

    // 7、关闭连接
    rs.close()
    pSt.close()
    conn.close()


  }

}
